<?php
/**
 * 本地应用管理，dao层
 *
 * @author Qiong Wu <papa0924@gmail.com>
 * @copyright ©2003-2103 phpwind.com
 * @license http://www.windframework.com
 *
 * @version $Id: PwApplicationDao.php 23963 2013-01-17 08:40:39Z long.shi $
 */
class PwApplicationDao extends PwBaseDao
{
    protected $_table = 'application';
    protected $_pk = 'app_id';
    protected $_dataStruct = array(
        'app_id',
        'name',
        'alias',
        'logo',
        'status',
        'author_name',
        'author_icon',
        'author_email',
        'website',
        'version',
        'pwversion',
        'created_time',
        'modified_time',
        'description', );

    /**
     * 添加应用.
     *
     * @param array $fields
     *
     * @return bool
     */
    public function add($fields)
    {
        if (!$fields = $this->_filterStruct($fields)) {
            return false;
        }
        $sql = $this->_bindTable('INSERT INTO %s SET ').$this->sqlSingle($fields);
        $statement = $this->getConnection()->createStatement($sql);
        $statement->execute();

        return $this->getConnection()->lastInsertId('app_id');
    }

    /**
     * 根据appid刪除应用，返回影响行数.
     *
     * @param string $id
     *
     * @return int
     */
    public function delByAppId($id)
    {
        $sql = $this->_bindTable('DELETE FROM %s WHERE app_id=?');

        return $this->getConnection()->createStatement($sql)->execute(array($id));
    }

    /**
     * 更新应用，返回影响行数.
     *
     * @param string $app_id
     * @param array  $fields
     *
     * @return int
     */
    public function update($app_id, $fields)
    {
        if (!$fields = $this->_filterStruct($fields)) {
            return false;
        }
        $sql = $this->_bindTable('UPDATE %s set ').$this->sqlSingle($fields).' WHERE app_id=?';

        return $this->getConnection()->createStatement($sql)->execute(array($app_id));
    }

    /**
     * 根据ID查找App应用注册信息，返回app数据.
     *
     * @param string $appId
     *
     * @return array
     */
    public function findByAppId($appId)
    {
        if (!$appId) {
            return false;
        }
        $sql = $this->_bindTable('SELECT * FROM %s ').' WHERE app_id=?';

        return $this->getConnection()->createStatement($sql)->getOne(array($appId));
    }

    /**
     * 根据应用别名查找应用注册信息，返回app数据.
     *
     * @param string $alias
     *
     * @return array
     */
    public function findByAlias($alias)
    {
        if (!$alias) {
            return false;
        }
        $sql = $this->_bindTable('SELECT * FROM %s ').' WHERE alias=?';

        return $this->getConnection()->createStatement($sql)->getOne(array($alias));
    }

    /**
     * 根据应用别名查找应用注册信息，返回app数据.
     *
     * @param array $alias
     *
     * @return array
     */
    public function fetchByAlias($alias, $index = 'app_id')
    {
        if (!$alias) {
            return array();
        }
        $sql = $this->_bindSql('SELECT * FROM %s WHERE alias IN %s', $this->getTable(), $this->sqlImplode($alias));

        return $this->getConnection()->query($sql)->fetchAll($index);
    }

    /**
     * 根据app_id批量获取.
     *
     * @param array $ids
     *
     * @return array
     */
    public function fetchByAppId($ids, $index = 'app_id')
    {
        $sql = $this->_bindSql('SELECT * FROM %s WHERE app_id IN %s', $this->getTable(),
            $this->sqlImplode($ids));

        return $this->getConnection()->query($sql)->fetchAll($index);
    }

    /**
     * app列表.
     *
     * @param int $num
     * @param int $start
     *
     * @return array
     */
    public function fetchByPage($num = 10, $start = 0, $index = 'app_id')
    {
        $sql = $this->_bindSql('SELECT * FROM %s ORDER BY `created_time` DESC %s',
            $this->getTable(), $this->sqlLimit($num, $start));

        return $this->getConnection()->createStatement($sql)->queryAll(array(), $index);
    }

    /**
     * 根据status获取列表.
     *
     * @param int    $num
     * @param int    $start
     * @param int    $status  是否有独立页面
     * @param string $orderby
     *
     * @return array
     */
    public function fetchListByStatus($num = 10, $start = 0, $status = 1, $orderby = 'created_time')
    {
        $sql = $this->_bindSql('SELECT * FROM %s WHERE status & ? ORDER BY ? DESC %s',
            $this->getTable(), $this->sqlLimit($num, $start));

        return $this->getConnection()->createStatement($sql)->queryAll(array($status, $orderby), $this->_pk);
    }

    /**
     * 根据status获取总数.
     *
     * @param int $status
     *
     * @return int
     */
    public function countByStatus($status = 1)
    {
        $sql = $this->_bindTable('SELECT COUNT(*) FROM %s WHERE status & ?');

        return $this->getConnection()->createStatement($sql)->getValue(array($status));
    }

    /**
     * 根据应用名称模糊搜索.
     *
     * @param string $name
     * @param int    $num
     * @param int    $start
     *
     * @return array
     */
    public function searchByName($name, $num = 10, $start = 0)
    {
        $sql = $this->_bindSql('SELECT * FROM %s WHERE `name` LIKE ? ORDER BY `created_time` %s',
            $this->getTable(), $this->sqlLimit($num, $start));

        return $this->getConnection()->createStatement($sql)->queryAll(array("%$name%"), $this->_pk);
    }

    /**
     * 统计搜索结果.
     *
     * @param string $name
     *
     * @return int
     */
    public function countSearchByName($name)
    {
        $sql = $this->_bindTable('SELECT COUNT(*) FROM %s WHERE `name` LIKE ?');

        return $this->getConnection()->createStatement($sql)->getValue(array("%$name%"));
    }

    /**
     * 获取app总数.
     *
     * @return int
     */
    public function count()
    {
        $sql = $this->_bindTable('SELECT COUNT(*) FROM %s');

        return $this->getConnection()->createStatement($sql)->getValue();
    }
}
